package main

import "fmt"

/*
1. 创建一个固定大小保存整数的栈。它无须超出限制的增长。定义 push 函数——
将数据放入栈，和 pop 函数——从栈中取得内容。栈应当是后进先出（LIFO）
的。
Figure 2.1. 一个简单的 LIFO 栈
push(k)
i k pop() k
l m
i++
i--
034 Chapter 2: 函数
2. 更进一步。编写一个 String 方法将栈转化为字符串形式的表达。可以这样的
方式打印整个栈： fmt.Printf("My stack %v\n", stack)
栈可以被输出成这样的形式： [0:m] [1:l] [2:k]
 */

type Stack struct{
	node int
	data [10]int
}

func (s *Stack)Push(num int)  {
	if s.node < len(s.data) {
		s.data[s.node] = num
		s.node ++
	}
}

func (s *Stack)Pop() int{
	n := 0
	if s.node >= 0 {
		s.node--
		n = s.data[s.node]
		s.data[s.node] = 0
	}
	return n
}

//tostring
func (s *Stack)ToString() {
	for k, v := range s.data {
		fmt.Println("[" ,k, ":" , v, "]")
	}
}

func main() {
	stack := &Stack{}
	fmt.Println(stack)
	stack.Push(1)
	stack.Push(2)
	//fmt.Println(stack)
	stack.ToString()
	fmt.Println(stack.Pop())
	fmt.Println(stack.Pop())
	fmt.Println(stack)
}